/* Autore: Nicola Agosti */
/*
Scrivi un programma che, utilizzando la struttura Data (giorno, mese, anno),
crei una funzione che, passati due parametri di tipo data, ritorni il numero di
giorni che intercorrono tra le due date.
N.B. Per semplicità si suppone che:
 - le date siano valide;
 - che non esistano gli anni bisestili;
 - che non esistano anni negativi (a.c.).
*/

#define _CRT_SECURE_NO_WARNINGS /* Necessario se utilizziamo Visual Studio */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* Definizione della struttura "struct data" */
/*
Le strutture ci permettono di definire nuovi tipi di dati a partire dalle tipologie di dati primitive (int, char, float, ecc.)
o da altre strutture precedentemente definite.

Per definire una struttura si usa l'istruzione "struct" seguita dal nome che vogliamo assegnare alla struttura
(nel nostro caso "data") e dall'elenco, racchiuso tra parentesi graffe e terminato con il ";", dei campi della
struttura. Ogni campo è composto dal tipo di dato e dal nome da associare allo stesso e dal ";" come carattere di
terminazione.
*/
struct data
{
	int giorno; /* Un numero intero tra 1 e 31 */
	int mese; /* Un numero intero tra 1 e 12 */
	int anno; /* Un numero intero maggiore o uguale a 0 (trascuro, per semplicità, gli anni a.c. */
};

/* Prototipi delle funzioni */
int diffDate(struct data, struct data); /* Funzione che calcola il numero di giorni che intercorrono tra le due date */
int numGironiDaInizioAnno(struct data); /* Funzione che ritorna il numero di giorni trascorsi dall'inizio dell'anno */
int numGiorniDallo_01_01_0000(struct data); /* Funzione che trasforma la data nel numero di giorni a partire dal 01/01/0000 */

int main()
{
	/* Dichiarazione di due variabili di tipo "struct data" */
	struct data data_1, data_2;

	/* Leggo le date */
	/*
	Per accedere, a partire da una variabile di tipo struttura, ad uno dei campi che la compongono si 
	utilizza l'operatore "."
	*/
	printf("Inserisci la prima data (gg mm aaaa): ");
	scanf("%d%d%d", &data_1.giorno, &data_1.mese, &data_1.anno);
	printf("Inserisci la seconda data (gg mm aaaa): ");
	scanf("%d%d%d", &data_2.giorno, &data_2.mese, &data_2.anno);

	/* Visualizzo il risultato */
	printf("\nLe due date differiscono per %d giorni.", diffDate(data_1, data_2));

	return 0;
}

/* Funzione che calcola il numero di giorni che intercorrono tra le due date */
int diffDate(struct data data_1, struct data data_2)
{
	int gg_data_1, gg_data_2;

	/* Trasformo le date in giorni dallo 01/01/0000 */
	gg_data_1 = numGiorniDallo_01_01_0000(data_1);
	gg_data_2 = numGiorniDallo_01_01_0000(data_2);

	/* Ritorno il numero di giorni che intercorrono tra le due date */
	return abs(gg_data_1 - gg_data_2);
}

/* Funzione che trasforma la data nel numero di giorni a partire dal 01/01/0000 */
int numGiorniDallo_01_01_0000(struct data data)
{
	int giorni;

	/* Trasformo il numero di anni in giorni */
	giorni = data.anno * 365; /* Trascuro gli anni bisestili */

	/* Aggiungo i giorni trascorsi dall'inizio dell'anno */
	giorni += numGironiDaInizioAnno(data); /* Trascuro gli anni bisestili */

	/* Ritorno il risultato */
	return giorni;
}

/* Funzione che ritorna il numero di giorni trascorsi dall'inizio dell'anno */
/* Trascuro gli anni bisestili */
int numGironiDaInizioAnno(struct data data)
{
	int giorni = 0;
	
	/* Trovo la somma dei giorni del mese antecedenti quelllo attuale */
	switch (data.mese - 1)
	{
	case 11:
		giorni += 30;

	case 10:
		giorni += 31;

	case 9:
		giorni += 30;

	case 8:
		giorni += 31;

	case 7:
		giorni += 31;

	case 6:
		giorni += 30;

	case 5:
		giorni += 31;

	case 4:
		giorni += 30;

	case 3:
		giorni += 31;

	case 2:
		giorni += 28;

	case 1:
		giorni += 31;
	}

	/* Aggiungo il numero di giorni trascorsi nel mese attuale e ritorno il risultato */
	/* -1 perchè oggi non è ancora trascorso */
	return giorni + data.giorno - 1;
}